#include<iostream>
#include"pollServer.hpp"
#include<memory>
#include"err.hpp"

using namespace std;
using namespace poll_ns;

static void usage(std::string proc)
{
    std::cerr << "usage:\t\n" << proc << "port" << std::endl;
}

std::string transaction(const std::string& request)
{
    return request;
}
int main(int argc,char* argv[])
{
    if(argc != 2)
    {
        usage(argv[0]);
        exit(USAGE_ERR);
    }
    std::cout << "test: " << sizeof(fd_set)*8 << std::endl;// 128byte,位图结构*8
    unique_ptr<PollServer> svr(new PollServer(transaction));

    svr->initServer();

    svr->start();
    return 0;
}


////////////////////////////////////////////////////////////////////////////////////////////////////////////

// poll也是Linux中多路转接的方案
// 解决：
// 1.seclect的fd有上限的问题
// 2.每次调用都要重新设置关心的fd

// int poll(struct pollfd *fds, nfds_t nfds, int timeout);
// struct pollfd *fds：动态数组，数组，new/malloc
// nfds_t nfds:数组大小
// int timeout：时间单位是ms    1. >0：在timeout以内，阻塞，否则非阻塞返回一次   2. ==0：非阻塞等待   3. <0：阻塞等待
// 返回值：桶select一样
// poll的作用和select一模一样：等待

// struct pollfd
// {
//     int fd;        /* file descriptor */
//     short events;  /* requested events */
//     short revents; /* returned events */
// };

// 用户->内核：要帮我关心一个fd哦
// 输入看：fd + events
// 内核->用户：你要关心的fd上面的events中有那些事件已经就绪啦
// 输出看：fd + revevts
// 1.这样就能让输入输出分离！poll不需要对参数进行重新设定！
// 2.解决了select fd有上限的问题，以为他的上限取决于用户敢设多大

// 缺点：
// 遍历问题